// Buffer.h
#ifndef NET_BUFFER_H
#define NET_BUFFER_H

#include <string>
#include <vector>
#include <cassert>
#include <algorithm>
#include <cstring>
#include "logger.h"

namespace net {

/**
 * @brief 网络通信缓冲区
 * 实现读写分离的循环缓冲区，支持数据的高效读写和内存管理
 */
class Buffer {
public:
    /**
     * @brief 构造函数
     * @param initialSize 初始缓冲区大小
     */
    explicit Buffer(size_t initialSize = 1024);

    /**
     * @brief 获取缓冲区起始地址
     */
    char* begin()   { return _buffer.data(); }
    const char* begin() const   { return _buffer.data(); }

    /**
     * @brief 获取当前写位置
     */
    char* writePosition()   { return begin() + _writeIdx; }
    const char* writePosition() const   { return begin() + _writeIdx; }

    /**
     * @brief 获取当前读位置
     */
    char* readPosition()    { return begin() + _readIdx; }
    const char* readPosition() const    { return begin() + _readIdx; }

    /**
     * @brief 获取尾部空闲空间大小
     */
    size_t tailSize() const     { return _buffer.size() - _writeIdx; }

    /**
     * @brief 获取头部空闲空间大小
     */
    size_t headSize() const { return _readIdx; }

    /**
     * @brief 获取可读数据大小
     */
    size_t readAbleSize() const { return _writeIdx - _readIdx; }

    /**
     * @brief 确保可写空间足够
     * @param len 需要的空间大小
     */
    void ensureWriteSpace(size_t len);

    /**
     * @brief 移动读偏移
     * @param len 偏移量
     */
    void moveReadOffset(size_t len);

    /**
     * @brief 移动写偏移
     * @param len 偏移量
     */
    void moveWriteOffset(size_t len);

    /**
     * @brief 写入数据
     * @param data 数据指针
     * @param len 数据长度
     */
    void write(const void* data, size_t len);

    /**
     * @brief 写入数据并更新写偏移
     * @param data 数据指针
     * @param len 数据长度
     */
    void writeAndPush(const void* data, size_t len);

    /**
     * @brief 写入字符串
     * @param data 字符串
     */
    void writeString(const std::string& data);

    /**
     * @brief 写入字符串并更新写偏移
     * @param data 字符串
     */
    void writeStringAndPush(const std::string& data);

    /**
     * @brief 写入另一个Buffer的数据
     * @param data 源Buffer
     */
    void writeBuffer(const Buffer& data);

    /**
     * @brief 写入另一个Buffer的数据并更新写偏移
     * @param data 源Buffer
     */
    void writeBufferAndPush(const Buffer& data);

    /**
     * @brief 读取数据
     * @param buff 输出缓冲区
     * @param len 读取长度
     */
    void read(void* buff, size_t len) const;

    /**
     * @brief 读取数据并更新读偏移
     * @param buff 输出缓冲区
     * @param len 读取长度
     */
    void readAndPop(void* buff, size_t len);

    /**
     * @brief 读取字符串
     * @param len 读取长度
     * @return 读取的字符串
     */
    std::string readString(size_t len) const;

    /**
     * @brief 读取字符串并更新读偏移
     * @param len 读取长度
     * @return 读取的字符串
     */
    std::string readStringAndPop(size_t len);

    /**
     * @brief 查找换行符位置
     * @return 换行符位置指针，未找到返回nullptr
     */
    const char* findCRLF() const;
    char* findCRLF();

    /**
     * @brief 获取一行数据（到换行符为止）
     * @return 一行数据，包含换行符
     */
    std::string getLine() const;

    /**
     * @brief 获取一行数据并更新读偏移
     * @return 一行数据，包含换行符
     */
    std::string getLineAndPop();

    /**
     * @brief 清空缓冲区
     */
    void clear();

private:
    std::vector<char> _buffer;  // 缓冲区内存
    size_t _readIdx;            // 读偏移
    size_t _writeIdx;           // 写偏移
};

} // namespace net

#endif // BUFFER_H